﻿#region Header
// Copyright 2007-2011, Jerónimo Milea
// 
// This file is part of NetJsWire.
// 
//     NetJsWire is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     NetJsWire is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with NetJsWire.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Xml;
using NetJsWire.JsonRpcHandler;
using NetJsWire.JsonRpcHandler.Attributes;

namespace NetJsWire.Widgets.Renderers.Data
{
    [ClassName( "Ext.data.DirectStore" )]
    internal class DirectStore : Store
    {
        private readonly Widgets.Data.DirectStore _baseStore;
        private XmlNode _columnsNode;

        public DirectStore( object baseObject )
            : base( baseObject )
        {
            _baseStore = ( Widgets.Data.DirectStore ) baseObject;
        }

        public override void Render()
        {
            if ( !Rendered )
            {
                SetConstructionProperty( "autoLoad", true );
            }
            ShouldRenderData = false;
            base.Render();
        }

        protected override void RenderColumns()
        {
            if ( ControlNode[ "columns" ] == null )
                _columnsNode = ControlNode.AppendChild( WebApplication.Instance.XmlDocument.CreateNode( XmlNodeType.Element, "columns", "" ) );
            else
                _columnsNode.RemoveAll();

            if ( _baseStore.DataSource != null )
            {
                // NOTE: Type is gonna be most of the time the DataSource because if its a DirectStore we don't need to set data in server...)
                if ( _baseStore.DataSource is Type )
                {
                    var props = ( ( Type ) _baseStore.DataSource ).GetProperties();
                    foreach ( var prop in props )
                    {
                        if ( !prop.IsSpecialName && prop.Name != "ExtensionData" )
                        {
                            var colNode = _columnsNode.AppendChild( WebApplication.Instance.XmlDocument.CreateNode( "element", "column", "" ) );
                            colNode.InnerText = prop.Name;
                        }
                    }
                }
            }
            else
            {
                base.RenderColumns();
            }
        }
    }
}
